{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19",
    "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5",
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:17.320417Z",
     "iopub.status.busy": "2023-11-07T12:01:17.320124Z",
     "iopub.status.idle": "2023-11-07T12:01:17.672797Z",
     "shell.execute_reply": "2023-11-07T12:01:17.671989Z",
     "shell.execute_reply.started": "2023-11-07T12:01:17.320390Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import gc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:17.674737Z",
     "iopub.status.busy": "2023-11-07T12:01:17.674363Z",
     "iopub.status.idle": "2023-11-07T12:01:21.311541Z",
     "shell.execute_reply": "2023-11-07T12:01:21.310522Z",
     "shell.execute_reply.started": "2023-11-07T12:01:17.674700Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "\n",
    "from torch.optim import AdamW\n",
    "from torch.optim.lr_scheduler import StepLR\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "from torch.nn.utils import clip_grad_norm_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:21.313487Z",
     "iopub.status.busy": "2023-11-07T12:01:21.312963Z",
     "iopub.status.idle": "2023-11-07T12:01:30.865953Z",
     "shell.execute_reply": "2023-11-07T12:01:30.865138Z",
     "shell.execute_reply.started": "2023-11-07T12:01:21.313453Z"
    }
   },
   "outputs": [],
   "source": [
    "import transformers\n",
    "from transformers import BertForSequenceClassification, BertTokenizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:30.868297Z",
     "iopub.status.busy": "2023-11-07T12:01:30.868000Z",
     "iopub.status.idle": "2023-11-07T12:01:31.230291Z",
     "shell.execute_reply": "2023-11-07T12:01:31.229210Z",
     "shell.execute_reply.started": "2023-11-07T12:01:30.868270Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.metrics import f1_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:31.231815Z",
     "iopub.status.busy": "2023-11-07T12:01:31.231502Z",
     "iopub.status.idle": "2023-11-07T12:01:31.236487Z",
     "shell.execute_reply": "2023-11-07T12:01:31.235422Z",
     "shell.execute_reply.started": "2023-11-07T12:01:31.231788Z"
    }
   },
   "outputs": [],
   "source": [
    "def free_memory():\n",
    "    gc.collect()\n",
    "    torch.cuda.empty_cache()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:31.238018Z",
     "iopub.status.busy": "2023-11-07T12:01:31.237726Z",
     "iopub.status.idle": "2023-11-07T12:01:32.629279Z",
     "shell.execute_reply": "2023-11-07T12:01:32.628385Z",
     "shell.execute_reply.started": "2023-11-07T12:01:31.237995Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>sentiment</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1945</th>\n",
       "      <td>Досудебное расследование по факту покупки ЕНПФ...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1957</th>\n",
       "      <td>Медики рассказали о состоянии пострадавшего му...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1969</th>\n",
       "      <td>Прошел почти год, как железнодорожным оператор...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1973</th>\n",
       "      <td>По итогам 12 месяцев 2016 года на территории р...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1975</th>\n",
       "      <td>Астана. 21 ноября. Kazakhstan Today - Агентств...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1980</th>\n",
       "      <td>Об аресте бывшего министра национальной эконом...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1982</th>\n",
       "      <td>Двое налетчиков совершили нападение на охранни...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1983</th>\n",
       "      <td>\"Самрук-Энерго\" в I квартале почти вдвое снизи...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1985</th>\n",
       "      <td>В 2016 году почти половина коррупционных прест...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1988</th>\n",
       "      <td>Google+\\nЧт 19 янв 2017 12:35:02\\nОдин из фигу...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                   text sentiment\n",
       "id                                                               \n",
       "1945  Досудебное расследование по факту покупки ЕНПФ...  negative\n",
       "1957  Медики рассказали о состоянии пострадавшего му...  negative\n",
       "1969  Прошел почти год, как железнодорожным оператор...  negative\n",
       "1973  По итогам 12 месяцев 2016 года на территории р...  negative\n",
       "1975  Астана. 21 ноября. Kazakhstan Today - Агентств...  negative\n",
       "1980  Об аресте бывшего министра национальной эконом...  negative\n",
       "1982  Двое налетчиков совершили нападение на охранни...  negative\n",
       "1983  \"Самрук-Энерго\" в I квартале почти вдвое снизи...  negative\n",
       "1985  В 2016 году почти половина коррупционных прест...  negative\n",
       "1988  Google+\\nЧт 19 янв 2017 12:35:02\\nОдин из фигу...  negative"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "articles = pd.read_json('data/articles/train.json')\n",
    "articles.drop_duplicates(subset=['text'], inplace=True)\n",
    "articles.set_index('id', inplace=True)\n",
    "articles.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:32.630791Z",
     "iopub.status.busy": "2023-11-07T12:01:32.630472Z",
     "iopub.status.idle": "2023-11-07T12:01:32.898757Z",
     "shell.execute_reply": "2023-11-07T12:01:32.897799Z",
     "shell.execute_reply.started": "2023-11-07T12:01:32.630756Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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3bt3N3RJAADgFnPLhpl169YpPT1dzz33nD7++GP16NFDDodDZWVlDV0aAAC4hdyyYeall17SpEmT9NRTTykhIUErVqxQRESEfve73zV0aQAA4BbSpKELuJpLly6pqKhIGRkZRltwcLCGDBmiwsLCq27jdrvldruN5bNnz0qSTp8+LY/HE7DaPB6PKisr1cQTrKrqoICNW99OnTrV0CUAAcM8RGPT5PL5hi7BL02qvaqsrNapU6cUGhoa0LHPnTsnSfJ6vTdeT0ArCJAvv/xSVVVVio6O9mmPjo7W3//+96tuk5WVpQULFtRqj4uLq5cazabN4oauAADzEI3J6Hoe/9y5c4qMjLyhvrdkmKmLjIwMpaenG8vV1dU6ffq0WrduraCgwP3Prby8XDExMfriiy9ktVoDNi6AG8c8BBpWfc5Br9erc+fOqX379je8zS0ZZtq0aaOQkBCVlpb6tJeWlspms111G4vFIovF4tPWsmXL+ipRVquVF1GggTEPgYZVX3PwRs/I1LglbwAOCwtTnz59lJ+fb7RVV1crPz9fdru9ASsDAAC3mlvyzIwkpaena/z48erbt6/69eunl19+WefPn9dTTz3V0KUBAIBbyC0bZh599FH97//+r+bPny+Xy6WePXvqgw8+qHVT8L+bxWLRc889V+uSFoB/H+Yh0LButTkY5PXns08AAAC3mFvynhkAAIAbRZgBAACmRpgBAACmRpipR5mZmerZs2dDlwE0GgUFBQoKCtKZM2eu2+/222/Xyy+//G+pCUBg1WX+EmYCJCgoSO+++65P28yZM32+KwfAzbn33nt18uRJ4wu1cnJyrvrlmHv27NHkyZP/zdUB302JiYlKS0tr0Bpu2Y9mNwbNmzdX8+bNG7oMoNEICwu75reAX6lt27b/hmoA3Civ16uqqio1aVI/scP0Z2YSExP17LPPavbs2WrVqpVsNpsyMzON9WfOnNHEiRPVtm1bWa1WDRo0SJ988onPGM8//7yioqLUokULTZw4UT/5yU98Lg/t2bNHSUlJatOmjSIjI/Xggw/q448/NtbffvvtkqQf/OAHCgoKMpavvMyUl5enpk2b1jo9Pn36dA0aNMhY3r59ux544AGFh4crJiZGzz77rM6fN9evqeK7LTExUdOmTdO0adMUGRmpNm3aaN68ecYv4H711VcaN26cbrvtNkVERGjYsGE6cuSIsf0///lPjRgxQrfddpuaNWumu+66S5s2bZLke5mpoKBATz31lM6ePaugoCAFBQUZc//K09SjR4/Wo48+6lOjx+NRmzZt9MYbb0j6+hvGs7KyFBcXp/DwcPXo0UN/+tOf6vmRAurfzb5HPvnkk3r44Yd9xkxLS1NiYqKxfuvWrVq6dKkxD48fP27M1ffff199+vSRxWLR9u3bdfToUY0cOVLR0dFq3ry57rnnHm3evPmmj9P0YUaSVq9erWbNmmnXrl3Kzs7WwoUL5XQ6JUk/+tGPVFZWpvfff19FRUXq3bu3Bg8erNOnT0uS1qxZoxdeeEE///nPVVRUpI4dO2r58uU+4587d07jx4/X9u3btXPnTt1xxx0aPny48TPle/bskSStWrVKJ0+eNJavNHjwYLVs2VJ//vOfjbaqqiqtW7dOY8aMkSQdPXpUQ4cO1ahRo7R//36tW7dO27dv17Rp0wL/oAH1aPXq1WrSpIl2796tpUuX6qWXXtLrr78u6esXv7179+qvf/2rCgsL5fV6NXz4cHk8HklSamqq3G63tm3bpgMHDujnP//5Vc9w3nvvvXr55ZdltVp18uRJnTx5UjNnzqzVb8yYMXrvvfdUUVFhtOXm5qqyslI/+MEPJElZWVl64403tGLFCh08eFAzZszQE088oa1bt9bHwwP8W93Me+S3Wbp0qex2uyZNmmTMw5iYGGP9T37yE7344ov67LPP1L17d1VUVGj48OHKz8/Xvn37NHToUI0YMUIlJSU3d5Bek3vwwQe9999/v0/bPffc450zZ473ww8/9FqtVu/Fixd91nfq1Mn761//2uv1er39+/f3pqam+qy/7777vD169LjmPquqqrwtWrTwvvfee0abJO8777zj0++5557zGWf69OneQYMGGcu5ublei8Xi/eqrr7xer9c7YcIE7+TJk33G+PDDD73BwcHeCxcuXLMe4Fby4IMPeuPj473V1dVG25w5c7zx8fHef/zjH15J3o8++shY9+WXX3rDw8O969ev93q9Xm+3bt28mZmZVx37b3/7m1eSMWdWrVrljYyMrNUvNjbWu2TJEq/X6/V6PB5vmzZtvG+88Yax/vHHH/c++uijXq/X67148aI3IiLCu2PHDp8xJkyY4H388cf9Pn7gVnKz75Hjx4/3jhw50mf99OnTvQ8++KDP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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "articles.sentiment.hist()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:32.900697Z",
     "iopub.status.busy": "2023-11-07T12:01:32.900300Z",
     "iopub.status.idle": "2023-11-07T12:01:32.906743Z",
     "shell.execute_reply": "2023-11-07T12:01:32.905789Z",
     "shell.execute_reply.started": "2023-11-07T12:01:32.900662Z"
    }
   },
   "outputs": [],
   "source": [
    "sentiment_map = {\n",
    "    'negative': 0,\n",
    "    'neutral': 1,\n",
    "    'positive': 2\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:32.908231Z",
     "iopub.status.busy": "2023-11-07T12:01:32.907941Z",
     "iopub.status.idle": "2023-11-07T12:01:32.930394Z",
     "shell.execute_reply": "2023-11-07T12:01:32.929326Z",
     "shell.execute_reply.started": "2023-11-07T12:01:32.908198Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>sentiment</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1945</th>\n",
       "      <td>Досудебное расследование по факту покупки ЕНПФ...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1957</th>\n",
       "      <td>Медики рассказали о состоянии пострадавшего му...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1969</th>\n",
       "      <td>Прошел почти год, как железнодорожным оператор...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1973</th>\n",
       "      <td>По итогам 12 месяцев 2016 года на территории р...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1975</th>\n",
       "      <td>Астана. 21 ноября. Kazakhstan Today - Агентств...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1980</th>\n",
       "      <td>Об аресте бывшего министра национальной эконом...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1982</th>\n",
       "      <td>Двое налетчиков совершили нападение на охранни...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1983</th>\n",
       "      <td>\"Самрук-Энерго\" в I квартале почти вдвое снизи...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1985</th>\n",
       "      <td>В 2016 году почти половина коррупционных прест...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1988</th>\n",
       "      <td>Google+\\nЧт 19 янв 2017 12:35:02\\nОдин из фигу...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                   text  sentiment\n",
       "id                                                                \n",
       "1945  Досудебное расследование по факту покупки ЕНПФ...          0\n",
       "1957  Медики рассказали о состоянии пострадавшего му...          0\n",
       "1969  Прошел почти год, как железнодорожным оператор...          0\n",
       "1973  По итогам 12 месяцев 2016 года на территории р...          0\n",
       "1975  Астана. 21 ноября. Kazakhstan Today - Агентств...          0\n",
       "1980  Об аресте бывшего министра национальной эконом...          0\n",
       "1982  Двое налетчиков совершили нападение на охранни...          0\n",
       "1983  \"Самрук-Энерго\" в I квартале почти вдвое снизи...          0\n",
       "1985  В 2016 году почти половина коррупционных прест...          0\n",
       "1988  Google+\\nЧт 19 янв 2017 12:35:02\\nОдин из фигу...          0"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "articles.sentiment = articles.sentiment.apply(lambda x: sentiment_map[x])\n",
    "articles.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:32.935756Z",
     "iopub.status.busy": "2023-11-07T12:01:32.935478Z",
     "iopub.status.idle": "2023-11-07T12:01:32.968849Z",
     "shell.execute_reply": "2023-11-07T12:01:32.967789Z",
     "shell.execute_reply.started": "2023-11-07T12:01:32.935712Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'cuda'"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "device = ('cuda' if torch.cuda.is_available() else 'cpu')\n",
    "device"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:32.970628Z",
     "iopub.status.busy": "2023-11-07T12:01:32.970262Z",
     "iopub.status.idle": "2023-11-07T12:01:32.980405Z",
     "shell.execute_reply": "2023-11-07T12:01:32.979494Z",
     "shell.execute_reply.started": "2023-11-07T12:01:32.970601Z"
    }
   },
   "outputs": [],
   "source": [
    "pretrained_model_name_or_path = 'DeepPavlov/rubert-base-cased'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:32.982031Z",
     "iopub.status.busy": "2023-11-07T12:01:32.981672Z",
     "iopub.status.idle": "2023-11-07T12:01:32.996077Z",
     "shell.execute_reply": "2023-11-07T12:01:32.994989Z",
     "shell.execute_reply.started": "2023-11-07T12:01:32.982000Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_labels = articles.sentiment.nunique()\n",
    "num_labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:32.997626Z",
     "iopub.status.busy": "2023-11-07T12:01:32.997293Z",
     "iopub.status.idle": "2023-11-07T12:01:39.777655Z",
     "shell.execute_reply": "2023-11-07T12:01:39.776626Z",
     "shell.execute_reply.started": "2023-11-07T12:01:32.997593Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "04e0280663264a6fb30454b0fec388c6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading (…)lve/main/config.json:   0%|          | 0.00/642 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "04c8ba49e5214121a98ac39f6a5ae3fe",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading pytorch_model.bin:   0%|          | 0.00/714M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Some weights of BertForSequenceClassification were not initialized from the model checkpoint at DeepPavlov/rubert-base-cased and are newly initialized: ['classifier.weight', 'classifier.bias']\n",
      "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "ac401dfeb7634dcf9d2c52ce8e250da4",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading (…)solve/main/vocab.txt:   0%|          | 0.00/1.65M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "aa403245e6654bc2afdb2966584ecdb4",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading (…)cial_tokens_map.json:   0%|          | 0.00/112 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "14d81ff00b3f40dc8fcf8d904c33e0bc",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading (…)okenizer_config.json:   0%|          | 0.00/24.0 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = BertForSequenceClassification.from_pretrained(pretrained_model_name_or_path, \n",
    "                                                      num_labels=num_labels)\n",
    "tokenizer = BertTokenizer.from_pretrained(pretrained_model_name_or_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:39.779249Z",
     "iopub.status.busy": "2023-11-07T12:01:39.778976Z",
     "iopub.status.idle": "2023-11-07T12:01:45.044676Z",
     "shell.execute_reply": "2023-11-07T12:01:45.043620Z",
     "shell.execute_reply.started": "2023-11-07T12:01:39.779225Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "BertForSequenceClassification(\n",
       "  (bert): BertModel(\n",
       "    (embeddings): BertEmbeddings(\n",
       "      (word_embeddings): Embedding(119547, 768, padding_idx=0)\n",
       "      (position_embeddings): Embedding(512, 768)\n",
       "      (token_type_embeddings): Embedding(2, 768)\n",
       "      (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\n",
       "      (dropout): Dropout(p=0.1, inplace=False)\n",
       "    )\n",
       "    (encoder): BertEncoder(\n",
       "      (layer): ModuleList(\n",
       "        (0-11): 12 x BertLayer(\n",
       "          (attention): BertAttention(\n",
       "            (self): BertSelfAttention(\n",
       "              (query): Linear(in_features=768, out_features=768, bias=True)\n",
       "              (key): Linear(in_features=768, out_features=768, bias=True)\n",
       "              (value): Linear(in_features=768, out_features=768, bias=True)\n",
       "              (dropout): Dropout(p=0.1, inplace=False)\n",
       "            )\n",
       "            (output): BertSelfOutput(\n",
       "              (dense): Linear(in_features=768, out_features=768, bias=True)\n",
       "              (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\n",
       "              (dropout): Dropout(p=0.1, inplace=False)\n",
       "            )\n",
       "          )\n",
       "          (intermediate): BertIntermediate(\n",
       "            (dense): Linear(in_features=768, out_features=3072, bias=True)\n",
       "            (intermediate_act_fn): GELUActivation()\n",
       "          )\n",
       "          (output): BertOutput(\n",
       "            (dense): Linear(in_features=3072, out_features=768, bias=True)\n",
       "            (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\n",
       "            (dropout): Dropout(p=0.1, inplace=False)\n",
       "          )\n",
       "        )\n",
       "      )\n",
       "    )\n",
       "    (pooler): BertPooler(\n",
       "      (dense): Linear(in_features=768, out_features=768, bias=True)\n",
       "      (activation): Tanh()\n",
       "    )\n",
       "  )\n",
       "  (dropout): Dropout(p=0.1, inplace=False)\n",
       "  (classifier): Linear(in_features=768, out_features=3, bias=True)\n",
       ")"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = model.to(device)\n",
    "model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:45.046001Z",
     "iopub.status.busy": "2023-11-07T12:01:45.045698Z",
     "iopub.status.idle": "2023-11-07T12:01:45.051454Z",
     "shell.execute_reply": "2023-11-07T12:01:45.050522Z",
     "shell.execute_reply.started": "2023-11-07T12:01:45.045976Z"
    }
   },
   "outputs": [],
   "source": [
    "embedding_parameters = [param for name, param in model.named_parameters() \n",
    "                        if 'classifier' not in name]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:45.053152Z",
     "iopub.status.busy": "2023-11-07T12:01:45.052452Z",
     "iopub.status.idle": "2023-11-07T12:01:47.700798Z",
     "shell.execute_reply": "2023-11-07T12:01:47.699804Z",
     "shell.execute_reply.started": "2023-11-07T12:01:45.053127Z"
    }
   },
   "outputs": [],
   "source": [
    "for param in embedding_parameters:\n",
    "    param.requires_grad = False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:47.702375Z",
     "iopub.status.busy": "2023-11-07T12:01:47.702063Z",
     "iopub.status.idle": "2023-11-07T12:01:47.713198Z",
     "shell.execute_reply": "2023-11-07T12:01:47.712378Z",
     "shell.execute_reply.started": "2023-11-07T12:01:47.702348Z"
    }
   },
   "outputs": [],
   "source": [
    "X = articles.text\n",
    "y = articles.sentiment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:47.715024Z",
     "iopub.status.busy": "2023-11-07T12:01:47.714410Z",
     "iopub.status.idle": "2023-11-07T12:01:47.727250Z",
     "shell.execute_reply": "2023-11-07T12:01:47.726512Z",
     "shell.execute_reply.started": "2023-11-07T12:01:47.714991Z"
    }
   },
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:47.728479Z",
     "iopub.status.busy": "2023-11-07T12:01:47.728164Z",
     "iopub.status.idle": "2023-11-07T12:01:47.739367Z",
     "shell.execute_reply": "2023-11-07T12:01:47.738512Z",
     "shell.execute_reply.started": "2023-11-07T12:01:47.728455Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[PAD]\n"
     ]
    }
   ],
   "source": [
    "tokenizer.pad_token_id = 0\n",
    "print(tokenizer.pad_token)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:47.740604Z",
     "iopub.status.busy": "2023-11-07T12:01:47.740347Z",
     "iopub.status.idle": "2023-11-07T12:01:47.751834Z",
     "shell.execute_reply": "2023-11-07T12:01:47.751010Z",
     "shell.execute_reply.started": "2023-11-07T12:01:47.740581Z"
    }
   },
   "outputs": [],
   "source": [
    "class SentimentAnalysisDataset(Dataset):\n",
    "    def __init__(self, X, y, tokenizer=None, num_labels=3):\n",
    "        self.X = tokenizer(X.tolist(), \n",
    "                           truncation=True, \n",
    "                           padding=True,\n",
    "                           return_tensors=\"pt\",\n",
    "                           max_length=512).to(device)\n",
    "        self.y = torch.tensor(y.to_numpy(), dtype=torch.int64).to(device)\n",
    "    \n",
    "    def __len__(self):\n",
    "        return len(self.y)\n",
    "    \n",
    "    def __getitem__(self, idx):\n",
    "        return self.X.input_ids[idx], self.X.attention_mask[idx], self.y[idx]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:01:47.753119Z",
     "iopub.status.busy": "2023-11-07T12:01:47.752864Z",
     "iopub.status.idle": "2023-11-07T12:04:31.774234Z",
     "shell.execute_reply": "2023-11-07T12:04:31.773389Z",
     "shell.execute_reply.started": "2023-11-07T12:01:47.753096Z"
    }
   },
   "outputs": [],
   "source": [
    "train_dataset = SentimentAnalysisDataset(X_train, y_train, tokenizer)\n",
    "test_dataset = SentimentAnalysisDataset(X_test, y_test, tokenizer)\n",
    "\n",
    "free_memory()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:04:31.775807Z",
     "iopub.status.busy": "2023-11-07T12:04:31.775464Z",
     "iopub.status.idle": "2023-11-07T12:04:31.780090Z",
     "shell.execute_reply": "2023-11-07T12:04:31.779159Z",
     "shell.execute_reply.started": "2023-11-07T12:04:31.775775Z"
    }
   },
   "outputs": [],
   "source": [
    "batch_size = 16\n",
    "num_epochs = 12"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:04:31.781643Z",
     "iopub.status.busy": "2023-11-07T12:04:31.781354Z",
     "iopub.status.idle": "2023-11-07T12:04:31.798319Z",
     "shell.execute_reply": "2023-11-07T12:04:31.797412Z",
     "shell.execute_reply.started": "2023-11-07T12:04:31.781619Z"
    }
   },
   "outputs": [],
   "source": [
    "train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:04:31.800044Z",
     "iopub.status.busy": "2023-11-07T12:04:31.799647Z",
     "iopub.status.idle": "2023-11-07T12:04:31.812697Z",
     "shell.execute_reply": "2023-11-07T12:04:31.811783Z",
     "shell.execute_reply.started": "2023-11-07T12:04:31.800005Z"
    }
   },
   "outputs": [],
   "source": [
    "optimizer = AdamW(model.classifier.parameters(), lr=0.01, weight_decay=1e-4)\n",
    "criterion = nn.CrossEntropyLoss()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:04:31.814323Z",
     "iopub.status.busy": "2023-11-07T12:04:31.813977Z",
     "iopub.status.idle": "2023-11-07T12:04:31.825440Z",
     "shell.execute_reply": "2023-11-07T12:04:31.824440Z",
     "shell.execute_reply.started": "2023-11-07T12:04:31.814290Z"
    }
   },
   "outputs": [],
   "source": [
    "def evaluate_model(model, data_loader):\n",
    "    ground_truth = []\n",
    "    predictions = []\n",
    "\n",
    "    model.eval()\n",
    "    for input_ids, attention_mask, labels in data_loader:\n",
    "        input_ids = input_ids.to(device)\n",
    "        attention_mask = attention_mask.to(device)\n",
    "        labels = labels.to(device)\n",
    "        outputs = model(input_ids=input_ids, attention_mask=attention_mask)\n",
    "        _, indices = torch.max(outputs.logits, 1)\n",
    "        predictions.extend(indices.tolist())\n",
    "        ground_truth.extend(labels.tolist())\n",
    "        del input_ids\n",
    "        del attention_mask\n",
    "        del labels\n",
    "        del outputs\n",
    "        del indices\n",
    "        free_memory()\n",
    "    accuracy = accuracy_score(ground_truth, predictions)\n",
    "    f1 = f1_score(ground_truth, predictions, average='macro')\n",
    "    del predictions\n",
    "    del ground_truth\n",
    "    free_memory()\n",
    "    return accuracy, f1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:04:31.827239Z",
     "iopub.status.busy": "2023-11-07T12:04:31.826949Z",
     "iopub.status.idle": "2023-11-07T12:04:31.838958Z",
     "shell.execute_reply": "2023-11-07T12:04:31.838134Z",
     "shell.execute_reply.started": "2023-11-07T12:04:31.827204Z"
    }
   },
   "outputs": [],
   "source": [
    "def train_model(model, train_loader, criterion, optimizer, num_epochs, \n",
    "                step_size=1, gamma=0.5):\n",
    "    scheduler = StepLR(optimizer, step_size=step_size, gamma=gamma)\n",
    "    loss_history = []\n",
    "    train_history = []\n",
    "    \n",
    "    for epoch in range(num_epochs):\n",
    "        model.train()\n",
    "        \n",
    "        loss_accum = 0\n",
    "        correct_samples = 0\n",
    "        total_samples = 0\n",
    "        \n",
    "        for i_step, (input_ids, attention_mask, y) in enumerate(train_loader):\n",
    "            input_ids = input_ids.to(device)\n",
    "            attention_mask = attention_mask.to(device)\n",
    "            y = y.to(device)\n",
    "            outputs = model(input_ids=input_ids, attention_mask=attention_mask)\n",
    "            optimizer.zero_grad()\n",
    "            loss = criterion(outputs.logits, y)\n",
    "            loss.backward()\n",
    "            clip_grad_norm_(model.classifier.parameters(), 1.0)\n",
    "            optimizer.step()\n",
    "            \n",
    "            _, indices = torch.max(outputs.logits, 1)\n",
    "            correct_samples += torch.sum(indices == y)\n",
    "            total_samples += y.shape[0]\n",
    "            loss_accum += loss\n",
    "            \n",
    "            del outputs\n",
    "            del indices\n",
    "            del input_ids\n",
    "            del attention_mask\n",
    "            del y\n",
    "            free_memory()\n",
    "          \n",
    "        scheduler.step()\n",
    "        ave_loss = loss_accum / i_step\n",
    "        train_accuracy = float(correct_samples) / total_samples\n",
    "\n",
    "        loss_history.append(float(ave_loss))\n",
    "        train_history.append(train_accuracy)\n",
    "        \n",
    "        free_memory()\n",
    "\n",
    "        print(\"Average loss: %f, Train accuracy: %f\" % (ave_loss, train_accuracy))\n",
    "        \n",
    "    return loss_history, train_history"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:04:31.840389Z",
     "iopub.status.busy": "2023-11-07T12:04:31.840103Z",
     "iopub.status.idle": "2023-11-07T12:50:53.041381Z",
     "shell.execute_reply": "2023-11-07T12:50:53.040415Z",
     "shell.execute_reply.started": "2023-11-07T12:04:31.840364Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average loss: 1.100176, Train accuracy: 0.492373\n",
      "Average loss: 0.926446, Train accuracy: 0.554961\n",
      "Average loss: 0.897694, Train accuracy: 0.577135\n",
      "Average loss: 0.870374, Train accuracy: 0.583425\n",
      "Average loss: 0.847888, Train accuracy: 0.596477\n",
      "Average loss: 0.843798, Train accuracy: 0.601352\n",
      "Average loss: 0.840460, Train accuracy: 0.598679\n",
      "Average loss: 0.829165, Train accuracy: 0.607328\n",
      "Average loss: 0.833426, Train accuracy: 0.607485\n",
      "Average loss: 0.837967, Train accuracy: 0.601038\n",
      "Average loss: 0.830769, Train accuracy: 0.608429\n",
      "Average loss: 0.827983, Train accuracy: 0.612989\n"
     ]
    }
   ],
   "source": [
    "loss_history, train_history = train_model(model, \n",
    "                                          train_loader, \n",
    "                                          criterion, \n",
    "                                          optimizer, num_epochs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:50:53.046748Z",
     "iopub.status.busy": "2023-11-07T12:50:53.046438Z",
     "iopub.status.idle": "2023-11-07T12:50:53.307070Z",
     "shell.execute_reply": "2023-11-07T12:50:53.306076Z",
     "shell.execute_reply.started": "2023-11-07T12:50:53.046709Z"
    }
   },
   "outputs": [],
   "source": [
    "free_memory()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:50:53.308436Z",
     "iopub.status.busy": "2023-11-07T12:50:53.308164Z",
     "iopub.status.idle": "2023-11-07T12:50:53.591224Z",
     "shell.execute_reply": "2023-11-07T12:50:53.590249Z",
     "shell.execute_reply.started": "2023-11-07T12:50:53.308412Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"History\")\n",
    "plt.plot(loss_history, label=\"Loss history\")\n",
    "plt.plot(train_history, label=\"Train history\")\n",
    "plt.legend(loc=\"upper left\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:50:53.593031Z",
     "iopub.status.busy": "2023-11-07T12:50:53.592629Z",
     "iopub.status.idle": "2023-11-07T12:50:53.598026Z",
     "shell.execute_reply": "2023-11-07T12:50:53.597133Z",
     "shell.execute_reply.started": "2023-11-07T12:50:53.592995Z"
    }
   },
   "outputs": [],
   "source": [
    "test_loader = DataLoader(test_dataset, batch_size=batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:51:49.635557Z",
     "iopub.status.busy": "2023-11-07T12:51:49.635115Z",
     "iopub.status.idle": "2023-11-07T12:52:46.232053Z",
     "shell.execute_reply": "2023-11-07T12:52:46.231036Z",
     "shell.execute_reply.started": "2023-11-07T12:51:49.635509Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test accuracy is 0.6132075471698113\n",
      "Test f1 score is 0.5442123904757672\n"
     ]
    }
   ],
   "source": [
    "accuracy, f1 = evaluate_model(model, test_loader)\n",
    "print(f\"Test accuracy is {accuracy}\")\n",
    "print(f\"Test f1 score is {f1}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:53:14.581802Z",
     "iopub.status.busy": "2023-11-07T12:53:14.580940Z",
     "iopub.status.idle": "2023-11-07T12:53:15.005242Z",
     "shell.execute_reply": "2023-11-07T12:53:15.004302Z",
     "shell.execute_reply.started": "2023-11-07T12:53:14.581760Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>id</th>\n",
       "      <th>sentiment</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Как сообщает пресс-служба акимата Алматы, для ...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Казахстанские авиакомпании перевозят 250 тысяч...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>На состоявшемся под председательством Касым-Жо...</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>В ОАЭ состоялись переговоры между казахстанско...</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>12 вагонов грузового поезда сошли с путей в Во...</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Отправившиеся на «джихад» из города Сатпаева К...</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>\\nНазарбаев утвердил новый состав правительств...</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>ШЫМКЕНТ. КАЗИНФОРМ - В Шардаринском районе Южн...</td>\n",
       "      <td>7</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>С 5 августа 2011 года вступил в юридическую с...</td>\n",
       "      <td>8</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Казахстанцы должны платить за коммунальные усл...</td>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                text  id  sentiment\n",
       "0  Как сообщает пресс-служба акимата Алматы, для ...   0          0\n",
       "1  Казахстанские авиакомпании перевозят 250 тысяч...   1          0\n",
       "2  На состоявшемся под председательством Касым-Жо...   2          0\n",
       "3  В ОАЭ состоялись переговоры между казахстанско...   3          0\n",
       "4  12 вагонов грузового поезда сошли с путей в Во...   4          0\n",
       "5  Отправившиеся на «джихад» из города Сатпаева К...   5          0\n",
       "6  \\nНазарбаев утвердил новый состав правительств...   6          0\n",
       "7  ШЫМКЕНТ. КАЗИНФОРМ - В Шардаринском районе Южн...   7          0\n",
       "8   С 5 августа 2011 года вступил в юридическую с...   8          0\n",
       "9  Казахстанцы должны платить за коммунальные усл...   9          0"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "articles_test = pd.read_json('data/articles/test.json')\n",
    "articles_test['sentiment'] = pd.Series([0] * len(articles_test), dtype=int)\n",
    "articles_test.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:53:19.399877Z",
     "iopub.status.busy": "2023-11-07T12:53:19.399016Z",
     "iopub.status.idle": "2023-11-07T12:53:19.405557Z",
     "shell.execute_reply": "2023-11-07T12:53:19.404558Z",
     "shell.execute_reply.started": "2023-11-07T12:53:19.399840Z"
    }
   },
   "outputs": [],
   "source": [
    "def classify(model, text, tokenizer):\n",
    "    model.eval()\n",
    "    input_ids = tokenizer.encode(text, return_tensors='pt', truncation=True, \n",
    "                                 max_length=512)\n",
    "    input_ids = input_ids.to(device)\n",
    "    outputs = model(input_ids=input_ids)\n",
    "    _, indices = torch.max(outputs.logits, 1)\n",
    "    return int(indices)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:53:22.847344Z",
     "iopub.status.busy": "2023-11-07T12:53:22.846976Z",
     "iopub.status.idle": "2023-11-07T12:54:45.616025Z",
     "shell.execute_reply": "2023-11-07T12:54:45.615081Z",
     "shell.execute_reply.started": "2023-11-07T12:53:22.847312Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>id</th>\n",
       "      <th>sentiment</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Как сообщает пресс-служба акимата Алматы, для ...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Казахстанские авиакомпании перевозят 250 тысяч...</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>На состоявшемся под председательством Касым-Жо...</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>В ОАЭ состоялись переговоры между казахстанско...</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>12 вагонов грузового поезда сошли с путей в Во...</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Отправившиеся на «джихад» из города Сатпаева К...</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>\\nНазарбаев утвердил новый состав правительств...</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>ШЫМКЕНТ. КАЗИНФОРМ - В Шардаринском районе Южн...</td>\n",
       "      <td>7</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>С 5 августа 2011 года вступил в юридическую с...</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Казахстанцы должны платить за коммунальные усл...</td>\n",
       "      <td>9</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                text  id  sentiment\n",
       "0  Как сообщает пресс-служба акимата Алматы, для ...   0          1\n",
       "1  Казахстанские авиакомпании перевозят 250 тысяч...   1          2\n",
       "2  На состоявшемся под председательством Касым-Жо...   2          1\n",
       "3  В ОАЭ состоялись переговоры между казахстанско...   3          2\n",
       "4  12 вагонов грузового поезда сошли с путей в Во...   4          0\n",
       "5  Отправившиеся на «джихад» из города Сатпаева К...   5          0\n",
       "6  \\nНазарбаев утвердил новый состав правительств...   6          1\n",
       "7  ШЫМКЕНТ. КАЗИНФОРМ - В Шардаринском районе Южн...   7          2\n",
       "8   С 5 августа 2011 года вступил в юридическую с...   8          1\n",
       "9  Казахстанцы должны платить за коммунальные усл...   9          1"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "articles_test['sentiment'] = articles_test['text']\\\n",
    "    .apply(lambda text: classify(model, text, tokenizer))\n",
    "articles_test.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:54:54.614999Z",
     "iopub.status.busy": "2023-11-07T12:54:54.614028Z",
     "iopub.status.idle": "2023-11-07T12:54:54.627200Z",
     "shell.execute_reply": "2023-11-07T12:54:54.626171Z",
     "shell.execute_reply.started": "2023-11-07T12:54:54.614962Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>id</th>\n",
       "      <th>sentiment</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Как сообщает пресс-служба акимата Алматы, для ...</td>\n",
       "      <td>0</td>\n",
       "      <td>neutral</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Казахстанские авиакомпании перевозят 250 тысяч...</td>\n",
       "      <td>1</td>\n",
       "      <td>positive</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>На состоявшемся под председательством Касым-Жо...</td>\n",
       "      <td>2</td>\n",
       "      <td>neutral</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>В ОАЭ состоялись переговоры между казахстанско...</td>\n",
       "      <td>3</td>\n",
       "      <td>positive</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>12 вагонов грузового поезда сошли с путей в Во...</td>\n",
       "      <td>4</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Отправившиеся на «джихад» из города Сатпаева К...</td>\n",
       "      <td>5</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>\\nНазарбаев утвердил новый состав правительств...</td>\n",
       "      <td>6</td>\n",
       "      <td>neutral</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>ШЫМКЕНТ. КАЗИНФОРМ - В Шардаринском районе Южн...</td>\n",
       "      <td>7</td>\n",
       "      <td>positive</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>С 5 августа 2011 года вступил в юридическую с...</td>\n",
       "      <td>8</td>\n",
       "      <td>neutral</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Казахстанцы должны платить за коммунальные усл...</td>\n",
       "      <td>9</td>\n",
       "      <td>neutral</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                text  id sentiment\n",
       "0  Как сообщает пресс-служба акимата Алматы, для ...   0   neutral\n",
       "1  Казахстанские авиакомпании перевозят 250 тысяч...   1  positive\n",
       "2  На состоявшемся под председательством Касым-Жо...   2   neutral\n",
       "3  В ОАЭ состоялись переговоры между казахстанско...   3  positive\n",
       "4  12 вагонов грузового поезда сошли с путей в Во...   4  negative\n",
       "5  Отправившиеся на «джихад» из города Сатпаева К...   5  negative\n",
       "6  \\nНазарбаев утвердил новый состав правительств...   6   neutral\n",
       "7  ШЫМКЕНТ. КАЗИНФОРМ - В Шардаринском районе Южн...   7  positive\n",
       "8   С 5 августа 2011 года вступил в юридическую с...   8   neutral\n",
       "9  Казахстанцы должны платить за коммунальные усл...   9   neutral"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "articles_test['sentiment'] = articles_test['sentiment']\\\n",
    "    .map({v: k for k, v in sentiment_map.items()})\n",
    "articles_test.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:55:02.683070Z",
     "iopub.status.busy": "2023-11-07T12:55:02.682296Z",
     "iopub.status.idle": "2023-11-07T12:55:02.696799Z",
     "shell.execute_reply": "2023-11-07T12:55:02.695886Z",
     "shell.execute_reply.started": "2023-11-07T12:55:02.683036Z"
    }
   },
   "outputs": [],
   "source": [
    "articles_test[['id', 'sentiment']].to_csv('output.csv', index=False)"
   ]
  },
  {
   "attachments": {
    "f359e470-5ec0-4a3d-94ea-38ae8a20db0b.png": {
     "image/png": "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vm/f70znhF5gP/Zs/QhvFFchcnURftahuzIR9QbH3n4Oj5cPwbPPTMIIHEDjn9fCMG0D/jDN/Wl3RERERHQ5fO9CvMNXJ6345pvT6NOnj9ItQnkFqS1ItvZ25Xfg5UtuvnyIXY/vgafutR/GnuYDCBp+D0YxCxD1am37P0L92x9i/6mbMPKRBzBBubeGiIiIiC63722Il86cOYvTNpszsMvwLskw7wj2P7hGd8Hd54mIiIiIiIguhu91iCciIiIiIiIKJN3lcd4ATkRERERERBQgGOKJiIiIiIiIAgRDPBEREREREVGAYIgnIiIiIiIiChAM8UREREREREQBgiGeiIiIiIiIKEAwxBMREREREREFCIZ4IiIiIiIiogDBEE9EREREREQUIBjiiYiIiIiIiAIEQzwRERERERFRgGCIJyIiIiIiIgoQDPFEREREREREAYIhnoiIiIiIiChAMMQTERERERERBQiGeCIiIiIiIqIAwRBPREREREREFCAY4omIiIiIiIgCBEM8ERERERERUYBgiCciIiIiIiIKEAzxRERERERERAGCIZ6IiIiIiIgoQDDEExEREREREQUIhngiIiIiIiKiAMEQT0RERERERBQg+tgF7b3TXtPnGBU+QhvqHc6dO4ejx07A2nZKebW3nxGvdpz79lttDiL6Prmqb18EBQWJVz/oB/SHXt8fg28IVsYTEREREQWq7vJ4rw/xJ746iUOHj+DI0ePiBH0Qbgy5AUH9+ikn7vIE/uqrrtLmJKLvk7PnzikX8tQLemdwxHIMR48dx003DsbQITfi+oF6bU4iIiIiosARsCFetra3fnYA3377LW679RYM4gk5EflBXviTfzvkBb6w227BgP79tSlERERERL1fd3m8V/Y7PXDwED7ffxC3DBuCu0bfwQBPRH4bdP1A3B31YwwTfz8++/wgzF8c1qYQEREREQW+XhfiP/mHCf/852n85I7bcUPwIG0sEVHPDBZ/P+Tfka+//gb/u7dVG0tEREREFNh6VYj/9PMDuPYHP8APR96mjSEiujC3jwqDTqfDZ/vN2hgiIiIiosDVa0K8bIHv2/cqDL/lZm0MEdHFcevwYegj/o8t8kREREQU6HpFiJf3wPft2xcjGOCJ6BIZIYK8xHvkiYiIiCiQXfEQ39Z2SnmaNLvQE9GlJrvWHz/xFdpOfa2NISIi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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image.png](attachment:f359e470-5ec0-4a3d-94ea-38ae8a20db0b.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-11-07T12:55:08.525083Z",
     "iopub.status.busy": "2023-11-07T12:55:08.524692Z",
     "iopub.status.idle": "2023-11-07T12:55:09.679384Z",
     "shell.execute_reply": "2023-11-07T12:55:09.678351Z",
     "shell.execute_reply.started": "2023-11-07T12:55:08.525049Z"
    }
   },
   "outputs": [],
   "source": [
    "torch.save(model, 'lt_rubert-sentiment-classifier.pth')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
